import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosHeaders } from 'axios';
import Cookies from 'js-cookie';

const apiClient = axios.create({
  baseURL: process.env.NEXT_PUBLIC_API_URL,  // 使用环境变量
  withCredentials: true
});

// 请求拦截器
apiClient.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 打印请求信息
    console.log('【请求信息】', {
      url: config.url,
      method: config.method,
      baseURL: config.baseURL,
      headers: config.headers,
      data: config.data
    });
    
    // 是否是登录请求
    const isLoginRequest = config.url?.includes('/login');

    // 设置请求头
    if (!config.headers) {
      config.headers = new AxiosHeaders();
    }
    
    // 添加防止缓存的头信息（特别针对GET请求）
    if (config.method?.toLowerCase() === 'get') {
      config.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
      config.headers.set('Pragma', 'no-cache');
      config.headers.set('Expires', '0');
    }
    
    // 只在未设置 Content-Type 时才设置默认值
    if (!config.headers.get('Content-Type')) {
      // 如果是登录请求或 offer 结果提交，使用 x-www-form-urlencoded
      if (isLoginRequest || config.url?.includes('/offer/result')) {
        config.headers.set('Content-Type', 'application/x-www-form-urlencoded');
      } 
      // 如果是文件上传，使用 multipart/form-data
      else if (config.url?.includes('/attachments') || (config.url?.includes('/offer') && !config.url?.includes('/result'))) {
        config.headers.set('Content-Type', 'multipart/form-data');
      }
      else if(config.url?.includes('/start')){
        config.headers.set('Content-Type', 'application/x-www-form-urlencoded');
      }
      // 其他请求使用 application/json
      else {
        config.headers.set('Content-Type', 'application/json');
      }
    }
  
    // 非登录请求时，添加token
    if (!isLoginRequest) {
      // 同时从localStorage和Cookies获取token，优先使用cookies中的
      const tokenFromCookies = Cookies.get('token');
      const tokenFromStorage = localStorage.getItem('token');
      const token = tokenFromCookies || tokenFromStorage;
      
      // 如果两处token不一致，进行同步
      if (tokenFromCookies && tokenFromStorage && tokenFromCookies !== tokenFromStorage) {
        localStorage.setItem('token', tokenFromCookies);
        console.log('【Token同步】localStorage的token已同步为cookies中的token');
      }
      
      // 添加token
      if (token) {
        config.headers.set('Token', token);
      }
    } else {
      console.log('【登录请求】不添加已有token');
    }

    return config;
  },
  (error) => {
    console.error('【请求错误】', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
apiClient.interceptors.response.use(
  (response) => {
    // 打印响应信息
    console.log('【响应信息】', {
      url: response.config.url,
      status: response.status,
      statusText: response.statusText,
      data: response.data
    });

    // 如果是登录响应，保存token到cookies和localStorage
    if (response.config.url?.includes('/login')) {
      // 从响应头获取token
      const headerToken = response.headers?.token;
      // 从响应体获取token
      const bodyToken = response.data?.data;
      
      // 使用header中的token或body中的token
      const token = headerToken || bodyToken;
      
      if (token) {
        // 同时保存到cookies和localStorage
        Cookies.set('token', token, { path: '/', expires: 7 });
        localStorage.setItem('token', token);
        console.log('【Token保存】token已同时保存到cookies和localStorage');
      }
    }
    return response;
  },
  (error) => {
    // 打印错误信息
    console.error('【响应错误】', {
      url: error.config?.url,
      status: error.response?.status,
      statusText: error.response?.statusText,
      data: error.response?.data,
      message: error.message
    });

    // 处理401错误
    if (error.response?.status === 401) {
      console.log('【认证失败】接收到401错误，清除token并重定向到登录页');
      
      // 清除所有token存储
      Cookies.remove('token', { path: '/' });
      localStorage.removeItem('token');
      sessionStorage.removeItem('token');
      
      // 避免重定向循环
      const currentPath = window.location.pathname;
      if (typeof window !== 'undefined' && currentPath !== '/login') {
        // 使用replace而不是location.href，防止在历史记录中堆积
        window.location.replace('/login');
      }
    }
    return Promise.reject(error);
  }
);

export default apiClient;